package psn.kiko.controller.report;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import psn.kiko.annotation.api.StableID;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.time.LocalDate;
import java.util.ArrayList;

@RestController
@RequestMapping("admin/report")
@Api(tags="报表接口")
public class ReportController{
	private static final String templateFileName="templateFile/近30日营业数据报表模板.xlsx";
	
	@GetMapping("export")
	@ApiOperation("导出最近30天营业数据")
	@StableID(701)
	public void export(HttpServletResponse response){
		//截止昨日，最近30天的起止
		LocalDate beginDate=LocalDate.now().minusDays(30);
		LocalDate endDate=LocalDate.now().minusDays(1);
		
		//概览模板数据
		ArrayList<Object> dataForRecent30Days=new ArrayList<>();
		dataForRecent30Days.add(2000);
		dataForRecent30Days.add(20);
		dataForRecent30Days.add(10);
		dataForRecent30Days.add("50%");
		dataForRecent30Days.add(200);
		
		//加载模板文件
		InputStream in=this.getClass().getClassLoader().getResourceAsStream(templateFileName);
		XSSFWorkbook excel=null;
		try{
			//注意点！！！！！---模板文件没有内容的地方，获取行后再获取单元格会获取不到，所以须先创建单元格后，再填充
			//从模板文件创建新的excel文件
			excel=new XSSFWorkbook(in);
			
			//获取sheet页
			XSSFSheet sheet=excel.getSheetAt(0);
			
			//填充时间段单元格
			XSSFRow row=sheet.getRow(1);
			row.getCell(1).setCellValue("时间："+beginDate+" 至 "+endDate);
			
			//填充概览单元格
			row=sheet.createRow(4);
			row.createCell(2).setCellValue(dataForRecent30Days.get(0).toString());
			row.createCell(3).setCellValue(dataForRecent30Days.get(1).toString());
			row.createCell(4).setCellValue(dataForRecent30Days.get(2).toString());
			row.createCell(5).setCellValue(dataForRecent30Days.get(3).toString());
			row.createCell(6).setCellValue(dataForRecent30Days.get(4).toString());
			
			//填充明细单元格
			for(int i=0;i<30;i++){
				//明细数据第一行至第三十行
				row=sheet.createRow(8+i);
				row.createCell(1).setCellValue(endDate.minusDays(i).toString());
				row.createCell(2).setCellValue(200);
				row.createCell(3).setCellValue(2);
				row.createCell(4).setCellValue(1);
				row.createCell(5).setCellValue("50%");
				row.createCell(6).setCellValue(200);
			}
			
			//设置响应内容类型、编码
			response.setContentType("application/vnd.ms-excel");
			response.setCharacterEncoding("UTF-8");
			//设置文件下载名
			String name=beginDate+"至"+endDate+"营业数据.xlsx";
			String filename=new String(name.getBytes(StandardCharsets.UTF_8),StandardCharsets.ISO_8859_1);
			response.setHeader("Content-Disposition","attachment; filename=\""+filename+"\"");
			
			//利用此次响应关联的输出流，将excel文件写到浏览器端
			excel.write(response.getOutputStream());
			
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			if(in != null){
				try{
					in.close();
				}catch(IOException e){
					e.printStackTrace();
				}
			}
			if(excel != null){
				try{
					excel.close();
				}catch(IOException e){
					e.printStackTrace();
				}
			}
		}
	}
}
